#ifndef MYSQL_CON_POOL_H
#define MYSQL_CON_POOL_H

#include <mysql/mysql.h>
#include <mutex>
#include <memory>
#include <queue>
#include <vector>
#include <iostream>
#include <string>
//只允许有一个实例
//对于一些错误信息，也可以加上日志模块进行输出
class mysql_con_pool {
public:
	static mysql_con_pool* get_instance();
	MYSQL* get_con();
	void return_con(MYSQL*);	//自己手动归还
	void create_pool();	//从配置文件里找参数          // 同时这也可以用于扩容
	
	//mysql语句的查询
	MYSQL_RES* get_query_result_by_store(MYSQL*, const char*);	//使用 mysql_store_result(&mysql)（数据一次性拉取）
	MYSQL_RES* get_query_result_by_use(MYSQL*, const char*);	//mysql_use_result()（数据流式拉取）
	//unsigned int mysql_field_count(MYSQL *mysql)    
	// unsigned int mysql_num_fields(MYSQL_RES *result)	//作用基本一样，返回上次查询结果的列数
private:
    void get_mysql_conf();
    
    std::string host;
    std::string user;
    std::string passwd;
    std::string db_name;
	std::string char_set;
	int port = 3306;	//默认缺省端口号为3306
	int num_of_con;
	static mysql_con_pool* instance;
	//内部类
	class for_mysql_con_pool {
	public:
		~for_mysql_con_pool(){
			if (mysql_con_pool::instance) {
				delete instance;
				instance = NULL;
				std::cout << "instance 置空了" << std::endl;
			}
		}
	};


	mysql_con_pool();
	mysql_con_pool(const mysql_con_pool&) = delete;
	mysql_con_pool operator=(const mysql_con_pool) = delete;
	~mysql_con_pool();
	std::queue<MYSQL*> con_pool;	//用于拿取，回收
	std::vector<MYSQL*>for_free;	//用于析构释放资源
	//
	std::mutex mtu;
};




#endif